package dk.itu.eyedroid.settings;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import dk.itu.eyedroid.R;
/*
* The class provides a screen with sliders for all the configuration
* parameters of the image processing methods. This can be used in order
* to change the configuration at runtime . Once the optimum configuration
* has been found the values should be hardcoded and the settings activity
* should be removed from the project.
*
* It is only used for development purposes.
*
* WARNING
* There is no checking for the values before they are set in the
* image processing methods. The settings activity is using sliders to
* set all these values usually ranging from 0 to max.
* The real ranges of these values are not the same so if not set
* to correct value it might cause the application to crash.
*
* The default configuration of EyeDroid has been configured with these
* values based on experimentation. If you wish to experiment to tune
* the image processing methods use the settings activity to change the values
* at runtime and once you find your configuration you can hardcode it both
* in the Config file and in the jni/Config.h file.
*/
public class SettingsActivity extends Activity {
public static final String TAG = "Settings"; // Logging TAG
/**
* Set application settings
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_settings);
ListView list = (ListView) this.findViewById(R.id.settings_root_layout);
list.setAdapter(new CustomAdapter(this, 1));
}
/**
* Settings adapter
*/
public class CustomAdapter extends ArrayAdapter<String> {
private Context mContext;
public CustomAdapter(Context context, int resource) {
super(context, resource);
mContext = context;
}
@Override
public int getCount() {
return 18;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.settings_list_item, parent, false);
Holder holder = new Holder();
holder.title = (TextView) convertView
.findViewById(R.id.settings_list_item_title);
holder.current = (TextView) convertView
.findViewById(R.id.settings_list_item_current_value);
holder.lower = (TextView) convertView
.findViewById(R.id.settings_list_item_lower_limit);
holder.upper = (TextView) convertView
.findViewById(R.id.settings_list_item_upper_limit);
holder.seekBar = (SeekBar) convertView
.findViewById(R.id.settings_seekbar);
holder.key = position;
switch (position) {
case Config.BEFORE_THRESHOLD_ERODE:
setUpListItem(holder, "Before thres erode",
Config.getConfigValue(position), 0, 16);
break;
case Config.BEFORE_THRESHOLD_DILATE:
setUpListItem(holder, "Before thres dilate",
Config.getConfigValue(position), 0, 16);
break;
case Config.AFTER_THRESHOLD_ERODE:
setUpListItem(holder, "After thres erode",
Config.getConfigValue(position), 0, 16);
break;
case Config.AFTER_THRESHOLD_DILATE:
setUpListItem(holder, "After thres dilate",
Config.getConfigValue(position), 0, 16);
break;
case Config.DIAMETER_FACTOR:
setUpListItem(holder, "Diameter factor",
Config.getConfigValue(position), 0, 8);
break;
case Config.ROI_CONSTANT_Y:
setUpListItem(holder, "Constant roi Y",
Config.getConfigValue(position), 0, 300);
break;
case Config.ROI_CONSTANT_X:
setUpListItem(holder, "Constant roi X",
Config.getConfigValue(position), 0, 300);
break;
case Config.ROI_CONSTANT_W:
setUpListItem(holder, "Constant roi W",
Config.getConfigValue(position), 0, 600);
break;
case Config.ROI_CONSTANT_H:
setUpListItem(holder, "Constant roi H",
Config.getConfigValue(position), 0, 600);
break;
case Config.ROI_PUPIL_FOUND_W:
setUpListItem(holder, "Pupil found roi W",
Config.getConfigValue(position), 0, 500);
break;
case Config.ROI_PUPIL_FOUND_H:
setUpListItem(holder, "Pupil found roi H",
Config.getConfigValue(position), 0, 500);
break;
case Config.THRESHOLD_LOWER_LIMIT:
setUpListItem(holder, "Threshold limit",
Config.getConfigValue(position), 0, 255);
break;
case Config.MIN_NEIGHBOR_DISTANCE_FACTOR:
setUpListItem(holder, "Min neighbor dist factor",
Config.getConfigValue(position), 0, 8);
break;
case Config.MIN_BLOB_SIZE:
setUpListItem(holder, "Min blob size",
Config.getConfigValue(position), 0, 200);
break;
case Config.MAX_BLOB_SIZE:
setUpListItem(holder, "Max blob size",
Config.getConfigValue(position), 0, 200);
break;
case Config.UPPER_THRESHOLD:
setUpListItem(holder, "Upper threshold",
Config.getConfigValue(position), 0, 300);
break;
case Config.THRESHOLD_CENTER:
setUpListItem(holder, "Threshold center",
Config.getConfigValue(position), 0, 250);
break;
case Config.SCALE_FACTOR:
setUpListItem(holder, "Scale factor",
Config.getConfigValue(position), 0, 8);
break;
default:
break;
}
return convertView;
}
public class Holder {
public TextView title;
public TextView current;
public TextView lower;
public TextView upper;
public SeekBar seekBar;
public int key;
}
private void setUpListItem(final Holder holder, final String message,
int defaultValue, int lower, int max) {
final int key = holder.key;
holder.title.setText(message);
holder.lower.setText(String.valueOf(lower));
holder.upper.setText(String.valueOf(max));
holder.current.setText(String.valueOf(defaultValue));
holder.seekBar.setMax(max);
holder.seekBar.setProgress(defaultValue);
holder.seekBar
.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Do nothing...
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Do nothing...
}
@Override
public void onProgressChanged(SeekBar seekBar,
int progress, boolean fromUser) {
Log.i(TAG, message + " values " + progress);
holder.current.setText(String.valueOf(progress));
Config.setConfigValue(key, progress);
}
});
}
}
}